<p>Mockito provides <em>argument matchers</em> and <em>argument captors</em> for flexibly stubbing or verifying method calls.</p>
<p><code>Mockito.verify()</code>, <code>Mockito.when()</code>, <code>Stubber.when()</code> and <code>BDDMockito.given()</code> each have overloads
with and without argument matchers.</p>
<p>However, if argument matchers or captors are used only on some of the parameters, all the parameters need to have matchers as well, otherwise an
<code>InvalidUseOfMatchersException</code> will be thrown.</p>
<p>This rule consequently raises an issue every time matchers are not used on all the parameters of a stubbed/verified method.</p>
<h2>Noncompliant Code Example</h2>
<pre>
@Test
public void myTest() {
  given(foo.bar(anyInt(), i1, i2)).willReturn(null); // Noncompliant
  when(foo.baz(eq(val1), val2)).thenReturn("hi"); // Noncompliant
  doThrow(new RuntimeException()).when(foo).quux(intThat(x -&gt; x &gt;= 42), -1); // Noncompliant
  verify(foo).bar(i1, anyInt(), i2); // Noncompliant
  ArgumentCaptor&lt;Integer&gt; captor = ArgumentCaptor.forClass(Integer.class);
  verify(foo).bar(captor.capture(), i1, any()); // Noncompliant
}
</pre>
<h2>Compliant Solution</h2>
<pre>
@Test
public void myTest() {
  given(foo.bar(anyInt(), eq(i1), eq(i2))).willReturn(null);
  when(foo.baz(val1, val2)).thenReturn("hi");
  doThrow(new RuntimeException()).when(foo).quux(intThat(x -&gt; x &gt;= 42), eq(-1));
  verify(foo).bar(eq(i1), anyInt(), eq(i2));
  ArgumentCaptor&lt;Integer&gt; captor = ArgumentCaptor.forClass(Integer.class);
  verify(foo).bar(captor.capture(), any(), any());
}
</pre>
<h2>See</h2>
<ul>
  <li> <a href="https://javadoc.io/doc/org.mockito/mockito-core/latest/org/mockito/Mockito.html#argument_matchers">Mockito documentation</a> -
  argument matchers </li>
  <li> {rule:java:S6068} - Call to Mockito method "verify", "when" or "given" should be simplified </li>
</ul>

